这个问题已经在这里有了答案: 重载运算符中没有隐式转换 (2个答案) 7年前关闭。 我正在为基本类型编写一个简单的包装程序,并试图避免不得不编写太多标准操作符。我希望隐式类型转换会有所帮助,但没有帮助。这是一个简化的示例: struct Int { int _i; Int(int i = 0):_i {i} {} Int运算符+(const Int&rhs){返回_i + rhs._i;} }; int main(int argc,char * argv []) { (无效)(Int(1)+ 2); // 美好的 (无效)(2 + Int(1)); //错误:对二进制表达式无效的操作数(“ int”和“ Int”) } 我正在使用llvm。第一行主要编译良好。第二个导致错误。现在,我希望在第二行中发生的是将2隐式转换为Int(2),然后再调用operator +。为什么不发生这种情况?为什么在第一行中发生隐式转换?
2021-03-01 08:16:37
它发生在第一行,因为唯一可用的operator +是operator +(Int&)(对于此实例,它具有隐式的Int第一参数)。第二行失败,因为第一个参数是int,并且不知道在尝试操作之前需要对其进行转换(它不知道需要使用Int :: operator +)。 您可以通过使操作员成为非成员朋友功能来避免该问题(http://ideone.com/YCf7wX) struct Int { int _i; Int(int i = 0):_i {i} {} 朋友Int运算符+(const Int&lhs,const Int&rhs); }; Int运算符+(const Int&lhs,const Int&rhs) { 返回lhs._i + rhs._i; } int main() { 诠释 我+ 5; 5 +我; 返回0; } | 不是您要找的答案?浏览标记为c ++运算符关键字隐式转换的其他问题,或者提出您自己的问题。